import numpy as np
import matplotlib.pyplot as plt

# 观察值
x = [-3.72, -3.68, -1.35, -0.89, -1.79, -2.85,
     -2.76, -3.72, -3.54, -2.26, -3.45,-3.07,
     -3.99, 2.87, -0.97, 0.79, 1.18, 3.06,
     -1.57, -1.48, -0.74, -0.42, -1.11, 4.25]
# 先验概率
Pw1 = 0.8
Pw2 = 0.2
# 类条件概率
mu1, var1 = -1, 0.16
mu2, var2 = 2, 2
# 最小风险贝叶斯决策表
# 决策a1表示选择W1，决策a2表示选择W2
# 风险值是根据特定情况下的决策者的偏好和利益来确定的
decision_table = {
    "a1": {"W1_risk": 0, "W2_risk": 4},
    "a2": {"W1_risk": 4, "W2_risk": 0}
}
# 计算后验概率
def posterior(x, mu, var, Pw):
    return np.exp(-(x - mu)**2 / (2 * var)) / np.sqrt(2 * np.pi * var) * Pw

posterior_w1 = np.prod(posterior(np.array(x), mu1, var1, Pw1))
posterior_w2 = np.prod(posterior(np.array(x), mu2, var2, Pw2))
posterior_total = posterior_w1 + posterior_w2

posterior_w1 = posterior_w1 / posterior_total
posterior_w2 = posterior_w2 / posterior_total

# 根据后验概率和最小风险贝叶斯决策表选择最小风险对应的决策
if decision_table["a1"]["W1_risk"] * posterior_w1 + decision_table["a1"]["W2_risk"] * posterior_w2 < decision_table["a2"]["W1_risk"] * posterior_w1 + decision_table["a2"]["W2_risk"] * posterior_w2:
    decision = "a1"
else:
    decision = "a2"

print("后验概率 P(W1|x) = {:.3f}, P(W2|x) = {:.3f}".format(posterior_w1, posterior_w2))
print("最小风险决策：{}".format(decision))

# 画出后验概率的分布曲线
x_range = np.linspace(-6, 6, 1000)
posterior_range_w1 = posterior(x_range, mu1, var1, Pw1)
posterior_range_w2 = posterior(x_range, mu2, var2, Pw2)
plt.figure(figsize=(10, 6))
plt.plot(x_range, posterior_range_w1, label='P(W1|x)')
plt.plot(x_range, posterior_range_w2, label='P(W2|x)')
plt.axvline(x=0, color='k', linestyle='--')  # 在x=0处画一条垂直虚线
plt.xlabel('x')
plt.ylabel('Posterior Probability')
plt.title('Posterior Probability Distribution')
plt.legend()

# 绘制分类结果示意图
x_decision = np.array([decision_table[decision]['W1_risk'], decision_table[decision]['W2_risk']])
y_decision = [0, 1]
plt.scatter(x_decision, y_decision, color='r', marker='x', label='Decision')
plt.ylim(-0.1, 1.1)
plt.yticks([0, 1], ['W1', 'W2'])
plt.legend()

plt.show()
